package heap

func getArrayClassName(className string) string {
	return "[" + toDescriptor(className)
}

/*
基本数据类型数组：

	int[] 的类名为 int[]，描述符为 [I
	char[] 的类名为 char[]，描述符为 [C
	double[] 的类名为 double[]，描述符为 [D

引用类型数组：

	String[] 的类名为 java.lang.String[]，描述符为 [Ljava/lang/String;
	Object[] 的类名为 java.lang.Object[]，描述符为 [Ljava/lang/Object;

多维数组：

	int[][] 的类名为 int[][]，描述符为 [[I
	String[][] 的类名为 java.lang.String[][]，描述符为 [[Ljava/lang/String;
*/

// 转化成描述符
func toDescriptor(className string) string {
	// 避免重复处理
	if className[0] == '[' {
		return className
	}
	// 如果是基础类型直接返回
	if d, ok := primitiveTypes[className]; ok {
		return d
	}
	// 引用类型
	return "L" + className + ";"
}

var primitiveTypes = map[string]string{
	"void":    "V",
	"boolean": "Z",
	"byte":    "B",
	"short":   "S",
	"int":     "I",
	"long":    "J",
	"char":    "C",
	"float":   "F",
	"double":  "D",
}

func getComponentClassName(className string) string {
	if className[0] == '[' {
		componentTypeDescriptor := className[1:]
		return toClassName(componentTypeDescriptor)
	}
	panic("Not array: " + className)
}

// 将类描述符转化为类名
func toClassName(descriptor string) string {
	// 数组，直接返回描述符作为类名
	if descriptor[0] == '[' {
		return descriptor
	}
	// 类描述符，去掉L和末尾分号就是类名
	if descriptor[0] == 'L' {
		return descriptor[1 : len(descriptor)-1]
	}
	// 判断是否为基础类型
	for className, d := range primitiveTypes {
		if d == descriptor {
			return className
		}
	}
	panic("Invalid descriptor: " + descriptor)
}
